<?php

namespace libs\qoy\Crypt;

/**
 * CryptMultiMcrypt 多级mcrypt加密
 * 对底层的mcrypt进行简单的再封装，以便存储和保留类型
 *
 * - 依赖CryptMcrypt进行加解密操作
 * - 支持任何数据类型的加解密
 * - 返回便于存储的字符串
 * @param array $config 初始化配置
 * @param array $config["iv"] 加密的向量 最大长度不得超过 MAX_IV_SIZE
 */
class MultiMcrypt implements ICrypt {

    /**
     * @var CryptMcrypt $mcrypt
     */
    protected $mcrypt = NULL;

    /**
     * 构造方法
     * @param array $config 初始化配置
     * @param array $config["iv"] 加密的向量 最大长度不得超过 MAX_IV_SIZE
     */
    public function __construct(array $config = array("iv" => '********')) {
        $this->mcrypt = new CryptMcrypt($config);
    }

    /**
     * @see ICrypt->encrypt
     */
    
    public function encrypt($data, string $key) {
        $encryptData = serialize($data);

        $encryptData = $this->mcrypt->encrypt($encryptData, $key);

        $encryptData = base64_encode($encryptData);

        return $encryptData;
    }

    /**
     * 忽略不能正常反序列化的操作，并且在不能预期解密的情况下返回原文
     * @see ICrypt->decrypt
     */
    
    public function decrypt($data, string $key) {
        $decryptData = base64_decode($data);

        if ($decryptData === FALSE || $decryptData === '') {
            return $data;
        }

        $decryptData = $this->mcrypt->decrypt($decryptData, $key);

        $decryptData = @unserialize($decryptData);
        if ($decryptData === FALSE) {
            return $data;
        }

        return $decryptData;
    }

}
